查看原文
其他

Max/MSP/Jitter 教程07 - ARGB 颜色

kidult00 科技无障碍 2022-11-03

Max/MSP/Jitter 教程 01 - 什么是矩阵?
Max/MSP/Jitter 教程 02 - Jitter 对象的属性
Max/MSP/Jitter 教程 03 - 播放 QuickTime 视频
Max/MSP/Jitter 教程 04 - 创建矩阵
Max/MSP/Jitter 教程 05 - 矩阵的数学运算
Max/MSP/Jitter 教程 06 - 控制视频播放

00 翻译自 Cycling74 的 Max/MSP/Jitter 官方文档:Tutorial 5: ARGB Color
https://docs.cycling74.com/max7/tutorials/jitterchapter05

Jitter 中的颜色

本节将讨论如何在 Jitter 中处理颜色,主要讲解用数字表示颜色,而不涉及把数字可视化为颜色。用数字表示颜色有许多方法,而关于色彩理论的全面讨论 - 光和物质如何产生色彩感觉 - 远远超出了本教程的范围。如果想了解颜色相关的理论和/或颜色数值表示的更多信息,可以查看参考书目。

本节重点说明 Jitter 表示颜色的方法,以及如何在矩阵中实现。

颜色组成:RGB

混合红色,绿色和蓝色可以产生任意颜色 - 每种颜色都有一定的亮度(intensity)。这是「加法合成(additive synthesis)」 - 添加一定量的三原色光来生成颜色(与此相反的是减法合成:混合有色颜料,如油漆,吸收某些颜色的光并反射其余部分)。这样就可以用红色,绿色和蓝色相对应的频率强度来描述任意颜色。

在 Jitter 中一般用红色,绿色和蓝色的精确亮度组合来描述颜色。对于图像的每个像素 - 无论是视频,图片还是其他 2D 矩阵 - 至少需要三个值表示三原色。屏幕上的彩色图像一般使用至少 3 个平面的 2D 矩阵。

Alpha 通道

第 4 个平面一般是 alpha 通道 - 它存储像素的透明度信息。Jitter 矩阵中一般都会包含颜色透明度的 alpha 通道。多数情况下,alpha 通道存储在平面 0(矩阵平面从 0 开始编号),RGB 值存储在 1,2 和 3 平面中

颜色数据:char,long 或 float

在计算机中用 8 位信息来表示每个基本颜色值。8 位能够表达 256(2 的 8 次幂)个不同值。如果分别用 8 位表示红色、绿色、蓝色,总共可以表示 16,777,216(2 的 24 次方)种不同颜色,足以覆盖人眼能够区分的所有颜色渐变。

因为 8 位分辨率已经可以表示所有基本颜色值,所以颜色信息矩阵 4 个平面中的值用 8 位 char 类型就足够了。当然 Jitter 也允许用 long,float32 或 float64 类型,只不过这会浪费内存。全帧视频图像要处理大量的像素(640x480 图像有 307,200 像素),为了节省内存和加快处理速度,最好使用 char 数据类型。

8 位 char 数据可以表示 0~255 之间的数字,或者 0~1 之间的灰度。包含 char 数据的 Jitter 对象,通常以 0~1 范围内浮点数的形式从其他 Max 对象接收数值。然后在内部计算时将浮点数转换为对应的 char 值(有一些例外,例如 jit.op 可以接收 0~1 的浮点数或右入口的 0~255 的整数)。关于在 Jitter 矩阵中使用 char 数据类型的更多内容,请参阅教程什么是矩阵?

分离矩阵的平面

在示例 patch 的顶部有两个视频。一个是街机游戏,另一个是视频校准的标准颜色条。打开 metro对象(用来反复触发矩阵对象)可以查看。

观看视频或静止图像

单击 metro 30对象上方标有 “show movie” 的按钮查看视频

示例 patch 用 jit.unpack 对象将颜色信息矩阵分解为 4 个平面,可以单独查看和修改每个平面。与 Max 对象 unpack 将列表拆开成单个数字类似,jit.unpack 将多平面矩阵分解为单平面矩阵。可以输入参数来指定矩阵中有多少个平面,默认是 4 个平面,这是颜色数据的标准。想看到红色,绿色和蓝色屏幕的内容,就将平面 1,2 和 3 发送到 jit.pwindow。因为这里不关心 alpha,所以不显示平面 0。

将多平面矩阵拆为单平面矩阵

可以用三个单色图像查看每个颜色平面的内容。较亮的像素表示该颜色值较大。将每个矩阵发送到 jit.op 可以单独控制每种颜色的强度,并改变颜色平衡。然后将单个(改变后的)矩阵发送到 jit.pack,重新组合为 4 平面矩阵在 jit.pwindow 中显示。

尝试将绿色和蓝色的强度降低到 0.12,生成更偏红色的图像:

降低某些颜色的亮度来改变颜色平衡

颜色交换

为了演示另一种技巧,将每个颜色平面发送到 gate 对象,这样每个矩阵都可以 routejit.pack 的不同入口(颜色平面)。这样就重新定义了每个平面,并且从 patch 左侧的 coll 对象中选择选项来尝试所有可能的颜色组合。

拖动标记为 “Rotate RGB planes” 的数字框,尝试重新分配三个颜色平面。(请注意,平面 0 直接从 jit.unpack 发送到 jit.pack ; 它是触发矩阵输出到 jit.pwindowjit.pack的左入口收到的 jit_matrix 消息)如果选择 coll 中的选项 3,会得到如下结果:

重新分配各个颜色平面; 红色和绿色平面相互交换

上面的示例显示原始的绿色和蓝色平面减少为原来的 0.12,并在发送到 jit.pack之前,用 gate 调换红色和绿色平面,得到更偏绿色的图像。coll 对象包含 RGB 平面所有可能的排列组合。

双击 coll 对象可以查看其内容:


RGB 平面分配的排列组合

来自 coll 列表中的元素被 unpack 并发送给 3 个 gate 对象。发送到 coll 的数字也会发送给 umenu(标签模式)用单词显示颜色状态 - 现在显示为 “Green-Red-Blue”。

颜色自动变化

让我们再来做一个颜色修改练习:制作不断更改颜色的缩放和旋转的自动化流程。

点击标记为 “Automate color changes” 的开关。三个颜色平面的缩放因子都在不断变化。双击 patch colorgames 对象查看子 patch 的内容。

[colorgames]子 patch

子 patch 用 line 对象为每个颜色缩放因子发送 0.5~1 的值。红色系数每 3 秒变化一次,绿色每 4 秒变化一次,蓝色每 5 秒变化一次(这三个 line 对象每 60 秒同步一次)。每隔 60 秒,metro 计数器会选择一个新的颜色组合。

你可以在不同的源图像上尝试所有颜色组合。回到主 patch,点击标记为 “Show movie” 的开关停止 metro。(也可以用这个开关来启动和停止 jit.movie 播放视频。如果不需要观看,就没必要持续播放)现在点击标有 “Show colorbars ” 的开关来显示颜色栏。试着更改此图像上的 scale 和 rotation 系数。

小结

jit.windowjit.pwindow 接收单平面 2D 矩阵时,会显示为单色(灰度)图像。当接收到 4 平面 2D 矩阵时,会将平面解析为 alpha,red,green 和 blue 值并显示相应颜色。Jitter 最常用 ARGB 4 平面矩阵来表示颜色。

Jitter 颜色数据以 char 数据类型存储,因为所有基本颜色只需要 8 位精度就可以完全覆盖。大多数与 QuickTime 相关的对象(例如 jit.movie)和许多专门用于操作颜色的对象(例如 jit.brcosajit.colorspace)都使用 4 平面 char 数据的 2D 矩阵。(许多对象会自适应其他数据类型。如有疑问请查看相应文档)。char 数据的范围是 0~255 的证书,或者 0~1 的浮点数。大多数情况下,包含 char 数据的对象从其他 Max 对象接收 0~1 的浮点数值。

jit.unpack 可以拆分多平面矩阵为单平面矩阵。jit.pack 打包单平面矩阵成一个多平面矩阵。单独处理每个平面可以控制图像的色彩平衡,甚至可以重新定义各个平面。



友情提示:独自折腾 Max 易患上癔症……不妨入群互助

👇👇👇


更多 Max/MSP 应用,请翻阅 MakeNoise 系列

MakeNoise01 - 声音是什么?
MakeNoise02 - 频率和音高
MakeNoise03 - 振幅/响度/音量/增益 大乱斗
MakeNoise04 - 波形和相位
MakeNoise05 - Envelope 包络(ADSR)
MakeNoise06 - 音色和均衡器(EQ)
MakeNoise07 - 音频的「分辨率」
MakeNoise08 - 振荡器和滤波器
MakeNoise09 - 压缩 Compression
MakeNoise10 - 延时和混响

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存